#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
// 2. 验证虚拟地址
// not change g_val
//int g_val = 0;
//int main()
//{
//	pid_t id = fork();
//	if (id < 0) {
//		perror("fork");
//		return 0;
//	}
//	else if (id == 0) { //child
//		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
//	}
//	else { //parent
//		printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
//	}
//	sleep(1);
//	return 0;
//}
// change g_val
int g_val = 0;
int main()
{
	pid_t id = fork();
	if (id < 0) {
		perror("fork");
		return 0;
	}
	else if (id == 0) { //child,子进程肯定先跑完，也就是子进程先修改，完成之后，父进程再读取
			g_val = 100;
		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	else { //parent
		sleep(3);
		printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	sleep(1);
	return 0;
}
//// 1.验证地址区域划分
//// 全局变量
//int g_unval;
//int g_val = 100;
//int main(int argc, char* argv[], char* env[])
//{
//	printf("代码地址: %p\n", main);
//	printf("初始化的全局变量地址: %p\n", &g_val);
//	printf("未初始化的全局变量地址: %p\n", &g_unval);
//	// 静态变量---共享区
//	static int test = 10;
//	// 字符串常量---常量区
//	const char* str = "helloworld";
//	// 堆区与栈区
//	char* heap_mem = (char*)malloc(10);
//	char* heap_mem1 = (char*)malloc(10);
//	char* heap_mem2 = (char*)malloc(10);
//	char* heap_mem3 = (char*)malloc(10);
//	printf("堆区地址: %p\n", heap_mem); 
//	printf("堆区地址: %p\n", heap_mem1); 
//	printf("堆区地址: %p\n", heap_mem2); 
//	printf("堆区地址: %p\n", heap_mem3); 
//	printf("静态变量(共享区)地址: %p\n", &test);
//	printf("仅读的字符串(常量区)地址: %p\n", str);
//	printf("栈区地址: %p\n", &heap_mem); 
//	printf("栈区地址: %p\n", &heap_mem1);
//	printf("栈区地址: %p\n", &heap_mem2); 
//	printf("栈区地址: %p\n", &heap_mem3); 
//	// 命令行参数与环境变量地址
//	for (int i = 0; i < argc; i++)
//	{
//		printf("命令行参数地址agrv[%d]: %p\n", i, argv[i]);
//	}
//	for (int i = 0; env[i]; i++)
//	{
//		printf("环境变量地址env[%d]: %p\n", i, env[i]);
//	}
//	return 0;
//}
